/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package livraria.objects;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import livraria.database.DBUtils;
import livraria.database.Conexao;
import livraria.database.exceptions.ErroDatabaseException;
import livraria.database.exceptions.RegistroNaoEncontradoException;
import livraria.database.exceptions.ValorJaExisteException;

/**
 *
 * @author Ivanovikjch
 */
public class Autor {
    //Dados sobre o autor
    private int codigo;
    private String nome;
    
    //Dados dos livros dos autores
    private HashMap<Integer, String>  nomes_livros;
    private ArrayList<Integer> codigos_livros;
    
    //Dado de controle de database, se for true , o objeto ja esta salvo na database
    private boolean ValorRegistrado;
    
    public Autor(int codigo, String nome, HashMap<Integer, String>  nomes, ArrayList<Integer> codigos){
        this(codigo, nome, nomes, codigos, false);
    }
    public Autor(int codigo, String nome, HashMap<Integer, String>  nomes, ArrayList<Integer> codigos, boolean reg){
        this.codigo = codigo;
        this.nome = nome;
        this.nomes_livros=nomes;
        this.codigos_livros = codigos;
        this.ValorRegistrado = reg;
    }
    
    //Metodos para obtencao e alteracao de valores
    public String getNome(){return this.nome;}
    public void setNome(String nome){this.nome = nome;}
    
    //Retorna a lista de objetos dos livros do autor
    public ArrayList<Livro> getLivrosObjects() throws SQLException{
        ArrayList<Livro> livros = new ArrayList<Livro>();
        for(int id : codigos_livros){
            livros.add(DBUtils.getLivroByCodigo(id));
        }
        return livros;
    }
    
    
    public void insertNewLivro(int codigo) throws ErroDatabaseException, ValorJaExisteException{
        try {
            PreparedStatement stm = Conexao.conecta().prepareStatement("SELECT nome FROM livros WHERE codigo = ?");
            stm.setInt(1, codigo);
            ResultSet rs = stm.executeQuery();
            if(!rs.next())
                throw new RegistroNaoEncontradoException();
            String nome_livro = rs.getString("nome");
            rs.close();
            stm.close();
            for(int id : codigos_livros){
                if(codigo == id)
                    throw new ValorJaExisteException();
            }
            stm = Conexao.conecta().prepareStatement("INSERT INTO autor_livro VALUES(?, ?)");
            stm.setInt(2, codigo);
            stm.setInt(1, this.codigo);
            int alteracoes = stm.executeUpdate();
            if(alteracoes == 0) 
                throw new ErroDatabaseException();
            codigos_livros.add(codigo);
            nomes_livros.put(codigo, nome_livro);
        } catch (SQLException ex) {
            throw new ErroDatabaseException();
        }  
    }
    
    //metodos para o registro do objeto na database
    private void insert() throws ErroDatabaseException{
        try {
            PreparedStatement stm = Conexao.conecta().prepareStatement("INSERT INTO autores VALUES(?, ?)");
            stm.setInt(1, codigo);
            stm.setString(2, nome);
            int alteracoes = stm.executeUpdate();
            if(alteracoes == 0) 
                throw new ErroDatabaseException();
            stm.close();
            
        } catch (SQLException ex) {
            throw new ErroDatabaseException();
        }
    }
    private void update()throws ErroDatabaseException{
        try {
            PreparedStatement stm = Conexao.conecta().prepareStatement("UPDATE autores SET nome = ? WHERE codigo = ?");
            stm.setInt(2, codigo);
            stm.setString(1, nome);
            int alteracoes = stm.executeUpdate();
            if(alteracoes == 0) 
                throw new ErroDatabaseException();
            
        } catch (SQLException ex) {
            throw new ErroDatabaseException();
        }
    }
    
    public void save() throws ErroDatabaseException{
        if(this.ValorRegistrado)
            update();
        else
            insert();
        
        this.ValorRegistrado = true;
    }
}
